package br.com.cast.notafiscal.pagina;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import br.com.cast.excecoes.NotaFiscalJaCadastrada;
import br.com.cast.modelo.NotaFiscal;
import br.com.cast.modelo.Produto;
import br.com.cast.produto.HomePage;
import br.com.cast.servico.INotaFiscalServico;
import br.com.cast.servico.IProdutoServico;
import br.com.cast.util.ComponentUtil;

public class FormNotaFiscal extends Form {

	@SpringBean
	private IProdutoServico produtoServico;

	@SpringBean
	private INotaFiscalServico notaFiscalProduto;

	private Produto produtoSelecionado;

	private WebMarkupContainer panelGrade;

	private Component valorTotalProdutos;

	private ListView<Produto> listView;

	public FormNotaFiscal(String id) {
		super(id);

		setDefaultModel(new CompoundPropertyModel<NotaFiscal>(new NotaFiscal()));

		criarFormulario();

		listarViewProduto();

	}

	protected void criarFormulario() {

		add(new TextField<NotaFiscal>("numero"));

		ChoiceRenderer<Produto> renderProduto = new ChoiceRenderer<Produto>(
				"valorDescricao");

		ListModel<Produto> model = new ListModel<>(
				produtoServico.buscarTodosProdutos());

		final DropDownChoice<Produto> produto = new DropDownChoice<Produto>(
				"produtos", new PropertyModel<Produto>(this,
						"produtoSelecionado"), model, renderProduto);

		add(new Button("salvar") {
			@Override
			public void onSubmit() {

				NotaFiscal notaFiscal = (NotaFiscal) FormNotaFiscal.this
						.getModelObject();

				try {
					notaFiscalProduto.salvar(notaFiscal);
					HomePage template = redirecionaListar();
					template.setVisibilityAllowed(true);
					template.success("Pedido cadastrado com sucesso!");
				} catch (NotaFiscalJaCadastrada e) {
					error(e.getMessage());
				}
			}
		});

		add(new AjaxButton("adicionarProduto") {

			@Override
			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
				((NotaFiscal) FormNotaFiscal.this.getModelObject())
						.getProdutos().add(produtoSelecionado);
				target.add(panelGrade);
				target.add(valorTotalProdutos);

			}

		});

		add(new Label("lblValorTotal", "Valor Total: "));

		valorTotalProdutos = new Label("valorTotalProdutos")
				.setOutputMarkupId(true);
		add(valorTotalProdutos);

		/*
		 * produto.add(new AjaxFormComponentUpdatingBehavior("change") { private
		 * static final long serialVersionUID = 1L;
		 * 
		 * @Override protected void onUpdate(AjaxRequestTarget target) {
		 * notaFiscal.getProdutos().add(produtoSelecionado);
		 * notaFiscal.setSomarProduto(notaFiscal.getSomarProduto()+
		 * produtoSelecionado.getValor()); target.add(panelGrade); } });
		 */

		add(produto);

	}

	public void listarViewProduto() {

		panelGrade = new WebMarkupContainer("panelGrade");
		panelGrade.setOutputMarkupId(true);

		listView = new ListView<Produto>("listProduto",
				((NotaFiscal) getModelObject()).getProdutos()) {

			protected void populateItem(final ListItem<Produto> item) {

				final Produto p = (Produto) item.getDefaultModelObject();

				item.add(new Label("descricao", p.getValorDescricao()));

				item.add(new AjaxLink<Void>("excluir") {
					private static final long serialVersionUID = 1L;

					@Override
					public void onClick(AjaxRequestTarget target) {
						((NotaFiscal) FormNotaFiscal.this.getModelObject())
								.getProdutos().remove(p);
						target.add(panelGrade);
						target.add(valorTotalProdutos);
					}

				});

			}
		};

		listView.setOutputMarkupId(true);

		panelGrade.add(listView);

		add(panelGrade);

	}

	private HomePage redirecionaListar() {

		HomePage template = ComponentUtil.getTemplate(this);
		template.replace(new ListarNotaFiscal(HomePage.CONTENT_ID));
		return template;
	}

	public void atualizaListaProdutos() {
		listView.setList(((NotaFiscal) getModelObject()).getProdutos());
	}
}
